#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTabWidget>
#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
#include <QStatusBar>
#include <QAction>
#include <QLabel>
#include <QProgressBar>
#include <QSplitter>
#include <QTreeWidget>
#include <QListWidget>
#include <QTableWidget>
#include <QMessageBox>
#include <QInputDialog>
#include <QFileDialog>
#include <QCloseEvent>
#include <QSettings>
#include <QTimer>
#include <QSystemTrayIcon>
#include <QDesktopWidget>
#include "sshmanager.h"
#include "sshsession.h"
#include "terminalwidget.h"
#include "sftpmanager.h"
#include "connectionmanager.h"
#include "configdialog.h"


namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    // 会话管理
    bool createNewSession(const ConnectionManager::ConnectionProfile &profile);
    bool createQuickSession(const QString &host, int port, const QString &username, const QString &password = "");
    void closeCurrentSession();
    void closeAllSessions();

    // 状态查询
    bool hasActiveSessions() const;
    int getSessionCount() const;
    QString getCurrentSessionId() const;

    void closeSessionTab(int index);
protected:
    void closeEvent(QCloseEvent *event) override;
    void showEvent(QShowEvent *event) override;
    void hideEvent(QHideEvent *event) override;
    bool eventFilter(QObject *watched, QEvent *event) override;

private slots:
    // 文件菜单
    void newConnection();
    void quickConnect();
    void reconnect();
    void disconnectSession();
    void saveSession();
    void saveSessionAs();
    void loadSession();
    void exportSettings();
    void importSettings();
    void exitApplication();

    // 编辑菜单
    void copy();
    void paste();
    void selectAll();
    void find();
    void clearScrollback();
    void resetTerminal();

    // 视图菜单
    void toggleFullscreen();
    void toggleMenuBar();
    void toggleToolBar();
    void toggleStatusBar();
    void toggleSideBar();
    void zoomIn();
    void zoomOut();
    void zoomReset();

    // 会话菜单
    void duplicateSession();
    void renameSession();
    void sessionProperties();
    void previousSession();
    void nextSession();
    void moveSessionLeft();
    void moveSessionRight();

    // 传输菜单
    void openFileTransfer();
    void uploadFile();
    void downloadFile();
    void transferQueue();
    void transferHistory();

    // 工具菜单
    void keyManager();
    void sessionManager();
    void connectionSettings();
    void preferences();
    void generateKeyPair();

    // 帮助菜单
    void showAbout();
    void showHelp();
    void showChangelog();
    void checkForUpdates();

    // 工具栏
    void onNewConnectionClicked();
    void onQuickConnectClicked();
    void onDisconnectClicked();
    void onFileTransferClicked();
    void onSettingsClicked();

    // 会话管理
    void onTabChanged(int index);
    void onTabCloseRequested(int index);
    void onTabMoved(int from, int to);
    void onSessionConnected(const QString &sessionId);
    void onSessionDisconnected(const QString &sessionId);
    void onSessionError(const QString &sessionId, const QString &error);

    // 连接管理
    void onProfileCreated(const ConnectionManager::ConnectionProfile &profile);
    void onProfileUpdated(const ConnectionManager::ConnectionProfile &profile);
    void onProfileDeleted(const QString &profileId);
    void onTestConnectionRequested(const ConnectionManager::ConnectionProfile &profile);

    // 文件传输
    void onFileTransferProgress(const QString &transferId, qint64 transferred, qint64 total);
    void onFileTransferFinished(const QString &transferId, bool success);
    void onFileTransferError(const QString &transferId, const QString &error);

    // 托盘图标
    void onTrayIconActivated(QSystemTrayIcon::ActivationReason reason);
    void onTrayMenuRequested();

    // 定时器
    void onStatusTimer();
    void onConnectionTimer();

private:

    Ui::MainWindow *ui;
    // UI组件
    QTabWidget *m_sessionTabs;
    QMenuBar *m_menuBar;
    QStatusBar *m_statusBar;
    QToolBar *m_toolBar;
    QSplitter *m_mainSplitter;
    QTreeWidget *m_connectionTree;
    QListWidget *m_transferList;
    QSystemTrayIcon *m_trayIcon;

    // 状态栏组件
    QLabel *m_statusLabel;
    QLabel *m_connectionLabel;
    QLabel *m_encodingLabel;
    QLabel *m_timeLabel;
    QProgressBar *m_progressBar;

    // 菜单
    QMenu *m_fileMenu;
    QMenu *m_editMenu;
    QMenu *m_viewMenu;
    QMenu *m_sessionMenu;
    QMenu *m_transferMenu;
    QMenu *m_toolsMenu;
    QMenu *m_helpMenu;

    // 工具栏
    QAction *m_newConnectionAction;
    QAction *m_quickConnectAction;
    QAction *m_disconnectAction;
    QAction *m_fileTransferAction;
    QAction *m_settingsAction;

    // 核心管理器
    SshManager *m_sshManager;
    ConnectionManager *m_connectionManager;

    // 会话映射
    QMap<QString, TerminalWidget*> m_terminalWidgets;
    QMap<QString, SftpManager*> m_sftpManagers;
    QMap<int, QString> m_tabSessionMap;

    // 定时器
    QTimer *m_statusTimer;
    QTimer *m_connectionTimer;

    // 设置
    QSettings *m_settings;
    bool m_saveSettings;
    bool m_confirmExit;
    bool m_minimizeToTray;
    bool m_startMinimized;

    // 创建UI
    void createMenus();
    void createToolBar();
    void createStatusBar();
    void createSideBar();
    void createTrayIcon();

    // 初始化
    void initializeConnections();
    void loadSettings();
    void saveSettings();
    void restoreSessionState();

    // 会话管理
    TerminalWidget* createTerminalWidget();
    SftpManager* createSftpManager(SshSession *session);
    void addSessionTab(TerminalWidget *terminal, const QString &title);
    void removeSessionTab(int index);
    void updateSessionTab(const QString &sessionId, const QString &title);
    void updateTabTitles();
    void cleanupSession(const QString &sessionId);

    // 连接树管理
    void populateConnectionTree();
    void addProfileToTree(const ConnectionManager::ConnectionProfile &profile);
    void removeProfileFromTree(const QString &profileId);
    void updateProfileInTree(const ConnectionManager::ConnectionProfile &profile);

    // 文件传输
    void updateTransferList();
    void addTransferToList(const SftpManager::FileTransferInfo &transfer);
    void removeTransferFromList(const QString &transferId);

    // 状态管理
    void updateStatus(const QString &message);
    void updateConnectionStatus(const QString &sessionId);
    void updateEncodingStatus();
    void updateProgress(int value, int maximum = 100);
    void updateTime();

    // 对话框
    bool confirmExit();
    bool confirmDisconnect(const QString &sessionId);
    bool confirmCloseTab(int index);
    void showError(const QString &title, const QString &message);
    void showInfo(const QString &title, const QString &message);
    void showWarning(const QString &title, const QString &message);

    // 工具方法
    QString generateSessionTitle(const QString &sessionId) const;
    QIcon getSessionIcon(bool connected) const;
    QString formatDuration(qint64 seconds) const;
    QString formatSize(qint64 bytes) const;
    void centerWindow();
    void saveWindowGeometry();
    void restoreWindowGeometry();

    // 快速连接
    bool showQuickConnectDialog();
    bool showConnectionDialog(ConnectionManager::ConnectionProfile &profile);

    // 导入/导出
    bool importProfilesFromFile(const QString &filePath);
    bool exportProfilesToFile(const QString &filePath);
};

#endif // MAINWINDOW_H
